#region Microsoft Public License
/*
 * (c) Copyright Chenjun Wu. http://utablesdk.codeplex.com
 * 
 * This source is subject to the Microsoft Public License (Ms-PL).
 * Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
 * All other rights reserved.
 */
#endregion

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using UTable.Input.MultiTouch;
using UTable.Objects.Handlers;

namespace UTable.Objects.Controls
{
	public class UComboBoxItem: ComboBoxItem, IControl
	{
        #region Constructors

		public UComboBoxItem()
        {
            this.Background = UTableHelper.OpacityBrush;
            this.HorizontalAlignment = HorizontalAlignment.Stretch;
            this.VerticalAlignment = VerticalAlignment.Stretch;
			this.Foreground = Brushes.Black;
            this.FontSize = 16;
            InitializeIControlPart();

			DetectContactsHandler handler = new DetectContactsHandler();
            handler.RouteDownEvents = false;
			handler.NewContact += new ContactEventHandler(OnNewContact);
			handler.NoContact += new ContactEventHandler(OnNoContact);
			MultiTouchProcessor.Handlers.Add(handler);
			this.Unselected += new RoutedEventHandler(UComboBoxItem_Unselected);
			this.Selected += new RoutedEventHandler(UComboBoxItem_Selected);
        }

        #endregion

		#region Methods

		protected virtual void OnNoContact(FingerEventArgs args)
		{
			Point p = args.Position;
			if (args.EventType == FingerEventType.FINGER_UP_EVENT && p.X >= 0 && p.X <= this.ActualWidth && p.Y >= 0 && p.Y <= this.ActualHeight)
			{
                // Select this item
                UComboBox comboBox = ItemsControl.ItemsControlFromItemContainer(this) as UComboBox;
                if (comboBox != null)
                {
                    comboBox.IsDropDownOpen = false;
                    comboBox.SelectedItem = this.DataContext;
                }
			}
			else
			{
				this.IsSelected = false;
			}
		}

		protected virtual void OnNewContact(FingerEventArgs args)
		{
			this.IsSelected = true;
            UComboBox comboBox = ItemsControl.ItemsControlFromItemContainer(this) as UComboBox;
            if (comboBox != null && comboBox.SelectedItem != null)
            {
                // I cannot find a good way to get the container from the item
                // (comboBox.ContainerFromElement(comboBox.SelectedItem) as UComboBoxItem).IsSelected = false;
            }
		}

		private void UComboBoxItem_Unselected(object sender, RoutedEventArgs e)
		{
			this.IsHighlighted = false;
		}

		private void UComboBoxItem_Selected(object sender, RoutedEventArgs e)
		{
			this.IsHighlighted = true;
		}

		#endregion

		#region IControl Implementation
		
		#region Private Fields

        private ControlBaseImpl _impl;

        #endregion

		#region Private Methods

		private void InitializeIControlPart()
        {
			_impl = new ControlBaseImpl(this);
            _impl.GotFingerCapture += new UTable.Input.MultiTouch.FingerEventHandler(_impl_GotFingerCapture);
            _impl.LostFingerCapture += new UTable.Input.MultiTouch.FingerEventHandler(_impl_LostFingerCapture);
			this.InputReceived += new UTable.Input.InputEventHandler(_impl_InputReceived);
        }

        void _impl_InputReceived(UTable.Input.InputEventArgs args)
        {
			if (args is UTable.Input.MultiTouch.MultiTouchEventArgs)
				MultiTouchProcessor.RaiseMultiTouchEvent(args as UTable.Input.MultiTouch.MultiTouchEventArgs);
        }

        void _impl_LostFingerCapture(object sender, UTable.Input.MultiTouch.FingerEventArgs args)
        {
            if (LostFingerCapture != null)
                LostFingerCapture(sender, args);
        }

        void _impl_GotFingerCapture(object sender, UTable.Input.MultiTouch.FingerEventArgs args)
        {
            if (GotFingerCapture != null)
                GotFingerCapture(sender, args);
        }

        #endregion

        #region IControl Members

        public UTable.Objects.Controls.ControlInfo Info
        {
            get { return _impl.Info; }
        }
		
		public UTable.Objects.Handlers.MultiTouchProcessor MultiTouchProcessor 
		{ 
			get { return _impl.MultiTouchProcessor; } 
		}

        #endregion

        #region IVisualNode Members

        public String ID
        {
            get { return _impl.ID; }
        }

        public new double Width
        {
            get { return _impl.Width; }
            set { _impl.Width = value; }
        }

        public new double Height
        {
            get { return _impl.Height; }
            set { _impl.Height = value; }
        }

        public new bool IsHitTestVisible
        {
            get { return _impl.IsHitTestVisible; }
            set { _impl.IsHitTestVisible = value; }
        }

        #endregion

        #region IInputNode Members

        public void RaiseEvent(UTable.Input.InputEventArgs e)
        {
            if (InputReceived != null)
            {
                InputReceived(e);
            }
            OnInputReceived(e);
        }

        public virtual void OnInputReceived(UTable.Input.InputEventArgs args)
        {
            _impl.OnInputReceived(args);
        }

        public bool CaptureFinger(int fingerId)
        {
            return _impl.CaptureFinger(fingerId);
        }

        public bool UncaptureFinger(int fingerId)
        {
            return _impl.UncaptureFinger(fingerId);
        }

        public event UTable.Input.MultiTouch.FingerEventHandler GotFingerCapture;

        public event UTable.Input.MultiTouch.FingerEventHandler LostFingerCapture;

        public event UTable.Input.InputEventHandler InputReceived;

        #endregion
        #endregion
	}
}
